﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using SC.eWedding.BusinessLogic.Views;
using SC.eWedding.BusinessLogic.Handlers;
using System.IO;
using Circo.Framework.BusinessLogic.Views.Filters;

public partial class Proveedor_Controles_veProducto : System.Web.UI.UserControl
{
    #region Propiedades Privadas

    private string Denominacion
    {
        get { return txtDenominacion.Text; }
        set { txtDenominacion.Text = value; }
    }

    private string Descripcion
    {
        get { return txtDescripcion.Text; }
        set { txtDescripcion.Text = value; }
    }

    private decimal Precio
    {
        get { return decimal.Parse(txtPrecio.Text); }
        set { txtPrecio.Text = value.ToString(); }
    }

    private int Categoria
    {
        get { return int.Parse(ddlCategoria.SelectedValue); }
        set { ddlCategoria.SelectedValue = value.ToString(); }
    }

    private int Tipo
    {
        get { return int.Parse(ddlTipo.SelectedValue); }
        set { ddlTipo.SelectedValue = value.ToString(); }
    }

    private ProdSerView ProdSer
    {
        get { return (ProdSerView)Session["Proveedor.ProdSer"]; }
        set { Session["Proveedor.ProdSer"] = value; }
    }

    private ProveedorView Proveedor
    {
        get { return (ProveedorView)Session["ProveedorView"]; }
        set { Session["ProveedorView"] = value; }
    }

    private List<CaracteristicaView> Caracteristicas
    {
        get
        {
            if (Session["Caracteristicas"] == null)
                Session["Caracteristicas"] = new List<CaracteristicaView>();
            return (List<CaracteristicaView>)Session["Caracteristicas"];
        }
        set { Session["Caracteristicas"] = value; }
    }

    private List<ProdSerLocView> Localidades
    {
        get
        {
            if (Session["Localidades"] == null)
                Session["Localidades"] = new List<ProdSerLocView>();
            return (List<ProdSerLocView>)Session["Localidades"];
        }
        set { Session["Localidades"] = value; }
    }

    private List<FotoDet> ListFotoDet
    {
        get
        {
            if (Session["FotoDet"] == null)
                Session["FotoDet"] = new List<FotoDet>();
            return (List<FotoDet>)Session["FotoDet"];
        }
        set { Session["FotoDet"] = value; }
    }

    #endregion

    #region Metodos Privados

    private void GuargarCaracteristicas()
    {
        foreach (CaracteristicaView car in ProdSer.Caracteristicas)
        {
            if (Caracteristicas.Find(delegate(CaracteristicaView c) { return c.Id == car.Id; }) == null)
                CaracteristicaHandler.Delete(car);
        }
        foreach (CaracteristicaView car in Caracteristicas)
        {
            car.ProdSer = ProdSer;
            CaracteristicaHandler.Persist(car);
        }
    }

    private void GuargarLocalidades()
    {
        foreach (ProdSerLocView ploc in ProdSer.Localidades)
        {
            if (Localidades.Find(delegate(ProdSerLocView pl) { return pl.Localidad.Id == ploc.Localidad.Id; }) == null)
                ProdSerLocHandler.Delete(ploc);
        }
        foreach (ProdSerLocView ploc in Localidades)
        {
            ploc.ProdSer = ProdSer;
            ProdSerLocHandler.Persist(ploc);
        }
    }

    private void CargarFotosBase(List<FotoView> fotos)
    {
        foreach (FotoView fot in fotos)
        {
            FotoDet fd = new FotoDet();
            fd.Id = fot.Id;
            fd.Descripcion = fot.Descripcion;
            fd.Path = "";

            ListFotoDet.Add(fd);
        }
    }

    static byte[] GetByteFile(string filename)
    {
        try
        {
            FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
            byte[] buffer = new byte[(int)fs.Length];
            fs.Read(buffer, 0, buffer.Length);
            fs.Close();

            return buffer;
        }
        catch (Exception ex)
        {
            throw new Exception("LoadFile - fileName: " + filename + " - " + ex.Message);
        }
    }

    private void CargarTipoProd()
    {
        List<TipoProdView> tipos = new List<TipoProdView>();

        TipoProdView tipoSel = new TipoProdView();
        tipoSel.Id = -1;
        tipoSel.Tipo = "<Seleccionar>";
        tipos.Add(tipoSel);

        if (Categoria != -1)
        {
            List<ViewFilter> filtros = new List<ViewFilter>();

            filtros.Add(new ViewCommonFilter("Categoria", Categoria));
            tipos.AddRange(TipoProdHandler.FindBy(filtros));
        }
        HabilitarControles();
        ddlTipo.DataSource = tipos;
        ddlTipo.DataBind();
    }

    private void CargarCategoria()
    {
        ddlCategoria.Items.Add(new ListItem("<Seleccionar>", "-1"));
        ddlCategoria.Items.Add(new ListItem("Producto", ((int)ProdSerView.TipoCateg.Producto).ToString()));
        ddlCategoria.Items.Add(new ListItem("Servicio", ((int)ProdSerView.TipoCateg.Servicio).ToString()));
        ddlCategoria.Items.Add(new ListItem("Regalo", ((int)ProdSerView.TipoCateg.Regalo).ToString()));

        ddlCategoria.DataBind();
    }

    private void ResetearIdLista()
    {
        int aux = 0;
        foreach (FotoDet fd in ListFotoDet)
        {
            if (fd.Id <= 0)
            {
                fd.Id = aux;
                aux--;
            }
        }
    }

    #endregion

    #region Metodos Publicos

    public void CargarItem()
    {
        if (ProdSer.Id != 0)
        {
            Precio = ProdSer.Precio;
            Categoria = (int)ProdSer.Categoria;
            Denominacion = ProdSer.Denominacion;
            CargarTipoProd();
            Tipo = ProdSer.Tipo.Id;
            Descripcion = ProdSer.Descripcion;
            Caracteristicas.AddRange(ProdSer.Caracteristicas);
            Localidades.AddRange(ProdSer.Localidades);
            CargarFotosBase(ProdSer.Fotos);
        }
        ucUbicacion.HabilitarControles();

        CargarListas();
    }

    public void CargarListas()
    {
        ucCaracteristica.CargarGrilla();
        ucUbicacion.CargarGrilla();
        dlFotos.DataSource = ListFotoDet;
        dlFotos.DataBind();
    }

    public void CargarCombos()
    {
        CargarCategoria();
        CargarTipoProd();
        ucUbicacion.CargarCombos();
    }

    public void Guardar()
    {
        try
        {
            if (ProdSer == null)
                ProdSer = new ProdSerView();
            ProdSer.Tipo = TipoProdHandler.FindById(Tipo);
            ProdSer.Precio = Precio;
            ProdSer.Denominacion = Denominacion;
            ProdSer.Proveedor = Proveedor;
            ProdSer.Categoria = (ProdSerView.TipoCateg)Categoria;
            ProdSer.Descripcion = Descripcion;

            ProdSerHandler.Persist(ProdSer);

            GuargarCaracteristicas();
            GuargarLocalidades();

            foreach (FotoDet fod in ListFotoDet)
            {
                if (fod.Id <= 0)
                {
                    FotoView fot = new FotoView();
                    fot.Imagen = GetByteFile(fod.Path);
                    fot.Nombre = fod.Path;
                    fot.Descripcion = fod.Descripcion;
                    fot.ProdSer = ProdSer;
                    FotoHandler.Persist(fot);
                }
            }

            Limpiar();
            lblMensaje.Text = "";
        }
        catch (Exception exc)
        {
            lblMensaje.Text = "Error: " + exc.Message;
        }
    }

    public void Limpiar()
    {
        Session.Remove("Caracteristicas");
        Session.Remove("FotoDet");
        Session.Remove("Proveedor.ProdSer");
        Session.Remove("Localidades");
    }

    public void HabilitarControles()
    {
        ddlTipo.Enabled = Categoria != -1;
    }

    #endregion

    #region Eventos

    protected void dlFotos_ItemDataBound(object sender, DataListItemEventArgs e)
    {

        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            Image image = (Image)e.Item.FindControl("imgFoto");

            int id = ((FotoDet)e.Item.DataItem).Id;
            if (id > 0)
                image.ImageUrl = "../../MakeThumbnail.aspx?id=" + id.ToString() + "&size=64x64&source=db&tipo=Foto";
            else
                image.ImageUrl = "../../MakeThumbnail.aspx?path=" + ((FotoDet)e.Item.DataItem).Path + "&size=64x64&source=file";
        }
    }

    protected void dlFotos_ItemCommand(object source, DataListCommandEventArgs e)
    {
        int id = int.Parse(e.CommandArgument.ToString());

        ListFotoDet.Remove(ListFotoDet.Find(delegate(FotoDet f) { return f.Id == id; }));
        ResetearIdLista();

        CargarListas();
    }

    protected void ddlCategoria_SelectedIndexChanged(object sender, EventArgs e)
    {
        CargarTipoProd();
    }

    #endregion
}
